#!/usr/bin/env python3
# -*- coding: utf-8 -*-

"""
控制台模式，用于无浏览器界面的运行和测试
"""

import argparse
import json
import os
import re
import sys
import threading
import time
from urllib.parse import urlparse

from modules.config_manager import ConfigManager
from modules.link_extractor import LinkExtractor

def parse_arguments():
    """解析命令行参数"""
    parser = argparse.ArgumentParser(description='音乐下载工具控制台模式')
    parser.add_argument('-u', '--url', help='直接处理指定URL')
    parser.add_argument('-f', '--file', help='从文件中读取URL列表')
    parser.add_argument('-e', '--extract', help='从URL中提取下载链接并保存到文件', action='store_true')
    parser.add_argument('-p', '--process', help='处理提取的下载链接文件')
    parser.add_argument('-o', '--output', help='输出路径', default='downloads')
    parser.add_argument('-c', '--check', help='检查下载链接有效性', action='store_true')
    parser.add_argument('-d', '--direct', help='直接下载蓝奏云链接', nargs='+')
    parser.add_argument('-m', '--manual', help='手动输入HTML分析模式', action='store_true')
    
    return parser.parse_args()

def extract_from_html(html_content):
    """从HTML内容中提取蓝奇云链接和密码"""
    # 使用与link_extractor.py中相同的模式
    patterns = [
        # 标准模式 - 链接后跟密码
        r'(https?://(?:www\.)?lanz[a-z0-9]*\.com/(?:s/)?[a-zA-Z0-9_\-]+)[^\w<>]*(?:提取|验证|访问)?码\s*[:：]?\s*(\w+)',
        r'(https?://(?:www\.)?lanzn\.com/(?:s/)?[a-zA-Z0-9_\-]+)[^\w<>]*(?:提取|验证|访问)?码\s*[:：]?\s*(\w+)',
        r'(https?://(?:www\.)?lanzoux\.com/(?:s/)?[a-zA-Z0-9_\-]+)[^\w<>]*(?:提取|验证|访问)?码\s*[:：]?\s*(\w+)',
        r'(https?://(?:www\.)?lanzoui\.com/(?:s/)?[a-zA-Z0-9_\-]+)[^\w<>]*(?:提取|验证|访问)?码\s*[:：]?\s*(\w+)',
        r'(https?://(?:[a-z0-9]+\.)?lanzou[a-z0-9]*\.com/[a-zA-Z0-9_\-]+)[^\w<>]*(?:提取|验证|访问)?码\s*[:：]?\s*(\w+)',
        
        # 文件夹模式 - 支持i/b格式
        r'(https?://(?:www\.)?lanz[a-z0-9]*\.com/b[a-zA-Z0-9_\-]+)[^\w<>]*(?:提取|验证|访问)?码\s*[:：]?\s*([a-zA-Z0-9]+)',
        r'(https?://(?:www\.)?lanzn\.com/b[a-zA-Z0-9_\-]+)[^\w<>]*(?:提取|验证|访问)?码\s*[:：]?\s*([a-zA-Z0-9]+)',
        r'(https?://(?:www\.)?lanzou[a-z0-9]*\.com/i[a-zA-Z0-9_\-]+)[^\w<>]*(?:提取|验证|访问)?码\s*[:：]?\s*([a-zA-Z0-9]+)',
        
        # 密码模式
        r'(https?://(?:www\.)?lanz[a-z0-9]*\.com/(?:s/)?[a-zA-Z0-9_\-]+)[^\w<>]*(?:密|密码|pwd|password)\s*[:：]?\s*([a-zA-Z0-9]+)',
        r'(https?://(?:www\.)?lanzn\.com/(?:s/)?[a-zA-Z0-9_\-]+)[^\w<>]*(?:密|密码|pwd|password)\s*[:：]?\s*([a-zA-Z0-9]+)',
        
        # 网盘格式
        r'(?:链接|网盘|云盘)[^\w<>]*[:：]?\s*(https?://(?:www\.)?lanz[a-z0-9]*\.com/(?:s/)?[a-zA-Z0-9_\-]+)[^\w<>]*(?:提取|验证|访问)?码\s*[:：]?\s*([a-zA-Z0-9]+)',
        r'(?:链接|网盘|云盘)[^\w<>]*[:：]?\s*(https?://(?:www\.)?lanzn\.com/(?:s/)?[a-zA-Z0-9_\-]+)[^\w<>]*(?:提取|验证|访问)?码\s*[:：]?\s*([a-zA-Z0-9]+)',
        
        # 短链格式 (蓝奏云使用的短链服务)
        r'(https?://(?:n\.)?lanzouw\.com/[a-zA-Z0-9_\-]+)[^\w<>]*(?:提取|验证|访问)?码\s*[:：]?\s*([a-zA-Z0-9]+)',
        r'(https?://(?:pan\.)?lanzoup\.com/[a-zA-Z0-9_\-]+)[^\w<>]*(?:提取|验证|访问)?码\s*[:：]?\s*([a-zA-Z0-9]+)',
    ]
    
    found_links_passwords = []
    found_links = set()  # 用于去重
    
    # 使用正则表达式查找匹配项
    for pattern in patterns:
        matches = re.findall(pattern, html_content)
        if matches:
            for match in matches:
                link, password = match
                # 处理链接，确保链接格式正确
                link = link.strip()
                # 更新蓝奏云链接域名为其最新域名
                if 'lanzou' in link and 'lanzouw.com' not in link and 'lanzoup.com' not in link:
                    for old_domain in ['lanzou.com', 'lanzous.com', 'lanzoux.com', 'lanzoui.com', 'lanzn.com']:
                        if old_domain in link:
                            link = link.replace(old_domain, 'lanzouw.com')
                            break
                
                # 规范化密码
                password = password.strip()
                
                if link not in found_links:  # 去重
                    found_links.add(link)
                    found_links_passwords.append((link, password))
                    print(f"找到链接: {link} - 密码: {password}")
    
    return found_links_passwords

def extract_links_from_url(url, save_to=None):
    """从URL中提取下载链接并保存"""
    try:
        import requests
        from bs4 import BeautifulSoup
        
        print(f"正在从 {url} 获取内容...")
        
        headers = {
            'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36'
        }
        
        response = requests.get(url, headers=headers, timeout=30)
        response.raise_for_status()
        
        # 设置正确的编码
        if response.encoding == 'ISO-8859-1':
            response.encoding = response.apparent_encoding
        
        html_content = response.text
        
        # 使用BeautifulSoup解析HTML，提取所有文本
        soup = BeautifulSoup(html_content, 'html.parser')
        text_content = soup.get_text()
        
        # 先从文本内容中提取
        links_passwords = extract_from_html(text_content)
        
        # 如果文本内容中没有找到，再从原始HTML中提取
        if not links_passwords:
            links_passwords = extract_from_html(html_content)
        
        # 如果需要保存结果
        if save_to and links_passwords:
            with open(save_to, 'w', encoding='utf-8') as f:
                for link, password in links_passwords:
                    f.write(f"{link}\t{password}\n")
            print(f"已将 {len(links_passwords)} 个链接保存到 {save_to}")
        
        return links_passwords
    
    except Exception as e:
        print(f"提取链接时出错: {str(e)}")
        return []

def process_links_file(file_path, output_dir='downloads'):
    """处理包含链接和密码的文件"""
    if not os.path.exists(file_path):
        print(f"文件 {file_path} 不存在!")
        return False
    
    # 确保输出目录存在
    os.makedirs(output_dir, exist_ok=True)
    
    links_passwords = []
    
    # 读取文件
    with open(file_path, 'r', encoding='utf-8') as f:
        for line in f:
            line = line.strip()
            if not line:
                continue
            
            parts = line.split('\t', 1)
            
            if len(parts) == 2:
                link, password = parts
            else:
                link = parts[0]
                password = ''
            
            links_passwords.append((link, password))
    
    print(f"从文件中读取了 {len(links_passwords)} 个链接")
    
    # TODO: 实现自动下载功能
    print("目前控制台模式仅支持提取链接，不支持自动下载。")
    print("请使用以下命令启动浏览器进行下载:")
    print(f"python lanzou_downloader.py -u '<URL>' --auto")
    
    return True

def manual_input_mode():
    """手动输入HTML分析模式"""
    print("已进入手动HTML分析模式")
    print("请粘贴HTML内容，完成后按Ctrl+D (Unix) 或 Ctrl+Z (Windows) 结束输入:")
    
    html_content = sys.stdin.read()
    
    if not html_content.strip():
        print("未输入任何内容!")
        return []
    
    print("\n正在分析HTML内容...")
    return extract_from_html(html_content)

def main():
    """主函数"""
    args = parse_arguments()
    
    # 检查配置文件是否存在
    config_manager = ConfigManager()
    
    # 手动输入模式
    if args.manual:
        links_passwords = manual_input_mode()
        if links_passwords:
            print("\n提取结果:")
            for i, (link, password) in enumerate(links_passwords, 1):
                print(f"{i}. 链接: {link}, 密码: {password}")
            
            # 可选: 保存结果到文件
            save = input("\n是否保存结果到文件? (y/n): ").lower()
            if save == 'y':
                filename = input("请输入文件名 (默认: extracted_links.txt): ") or "extracted_links.txt"
                with open(filename, 'w', encoding='utf-8') as f:
                    for link, password in links_passwords:
                        f.write(f"{link}\t{password}\n")
                print(f"已保存到 {filename}")
        return
    
    # 直接从URL提取
    if args.url:
        output_file = args.output if args.output.endswith('.txt') else 'extracted_links.txt'
        links_passwords = extract_links_from_url(args.url, output_file if args.extract else None)
        
        if links_passwords:
            print("\n提取结果:")
            for i, (link, password) in enumerate(links_passwords, 1):
                print(f"{i}. 链接: {link}, 密码: {password}")
    
    # 从文件中读取URL列表
    elif args.file:
        if not os.path.exists(args.file):
            print(f"文件 {args.file} 不存在!")
            return
        
        with open(args.file, 'r', encoding='utf-8') as f:
            urls = [line.strip() for line in f if line.strip()]
        
        all_links = []
        for url in urls:
            print(f"\n处理 URL: {url}")
            links = extract_links_from_url(url)
            all_links.extend(links)
        
        if all_links and args.extract:
            output_file = args.output if args.output.endswith('.txt') else 'extracted_links.txt'
            with open(output_file, 'w', encoding='utf-8') as f:
                for link, password in all_links:
                    f.write(f"{link}\t{password}\n")
            print(f"\n已将所有链接保存到 {output_file}")
    
    # 处理提取的下载链接文件
    elif args.process:
        process_links_file(args.process, args.output)
    
    # 直接处理蓝奇云链接
    elif args.direct:
        links = args.direct
        print("直接处理以下蓝奇云链接:")
        for i, link in enumerate(links, 1):
            print(f"{i}. {link}")
        
        print("\n目前控制台模式不支持直接下载，请使用以下命令启动浏览器进行下载:")
        cmd_args = []
        for link in links:
            cmd_args.append(f"-u '{link}'")
        print(f"python lanzou_downloader.py {' '.join(cmd_args)} --auto")
    
    # 如果没有提供任何操作参数，打印帮助信息
    else:
        print("请提供操作参数。使用 -h 或 --help 查看帮助。")
        print("\n常用命令示例:")
        print("1. 从URL提取下载链接:")
        print("   python console_mode.py -u 'https://www.example.com/music' -e")
        print("\n2. 从文件中读取多个URL并提取链接:")
        print("   python console_mode.py -f url_list.txt -e")
        print("\n3. 手动输入HTML进行分析:")
        print("   python console_mode.py -m")

if __name__ == "__main__":
    main() 